package com.bo.libnet.net;

import android.app.Activity;

import com.bo.libnet.net_ui.NetUi;
import com.bo.libnet.net_ui.NetUiImpl;
import com.orhanobut.logger.Logger;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
 * Created by ZJB on 2018/1/31.
 *
 * @ copyright: iwhere chengdu technology
 * 网络调用使用层，所有要去调用网络的使用层
 */

public class ApiCall {

    private boolean isActivityDestroyedNoReturn = false;//如果当前的Activity销毁了，是否不需要回调,默认需要回调
    private Activity mActivity;
    private NetUi netUi;
    private ApiCall(Activity activity){
        mActivity = activity;
        netUi = new NetUiImpl(activity);
    }

    /**
     * 每调用一次创建一个新的对象
     * @param activity
     * @return
     */
    public static ApiCall newInstance(Activity activity){
        return new ApiCall(activity);
    }

    //可以自己实现网络的UI层
    public void setNetUi(NetUi netUi){
        if (netUi != null) {
            this.netUi = netUi;
        }
    }


    public static <T> T getSeverceApi(Class<T> tClass){
        return ApiNet.getInstance().getApiServce(tClass);
    }

    /**
     * 开始执行网络请求
     * @param call 。。
     * @param apiCallBack。。
     * @param args 第一个参数：acitivity销毁之后还需要不需要回调   第二个参数：是否需要显示loadingDialog 默认要显示
     * @param <T>。。
     */
    public <T> void enquene(retrofit2.Call<T> call, final ApiCallBack<T> apiCallBack,boolean... args){
        if(call.isExecuted()){
            return;
        }
        if (args != null && args.length > 0) {
            this.isActivityDestroyedNoReturn = args[0];
        }
        showNetUi(args);
        call.enqueue(new Callback<T>() {
            @Override
            public void onResponse(Call<T> call, Response<T> response) {
                netUi.hideLoadingUi();
                if(apiCallBack != null && !isNoCallBack()){
                    apiCallBack.onSuccess(call,response);
                }
            }

            @Override
            public void onFailure(Call<T> call, Throwable t) {
                netUi.hideLoadingUi();
                Logger.v(t.getMessage());
                if(apiCallBack != null && !isNoCallBack()){
                    apiCallBack.onFail(call,t);
                }
            }
        });
    }

    private void showNetUi(boolean[] args) {
        if (args != null && args.length > 1) {
            if(args[1]){
                netUi.showLoadingUi();
            }
        }else {
            netUi.showLoadingUi();
        }
    }

    //判断当前是否不需要回调
    private boolean isNoCallBack() {
        return ApiCall.this.isActivityDestroyedNoReturn && mActivity != null && !mActivity.isDestroyed();
    }


}
